home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-07-01 | 70.4 KB | 2,458 lines |
- diff -u -r --new-file last-version/examples/tridge/README samba-1.9.14alpha4/examples/tridge/README
- --- last-version/examples/tridge/README Thu Jun 29 16:42:40 1995
- +++ samba-1.9.14alpha4/examples/tridge/README Sat Jul 1 13:23:17 1995
- @@ -1,4 +1,8 @@
- This is the configuration I use at home. I have 2 client PCs, one
- -running Win95, one running alternately WfWg and NTAS3.5.
- +running Win95, one running alternately WfWg and NTAS3.5. My server is
- +a 486dx2-66 Linux box.
-
- -My server is a 486dx266 Linux box.
- +Note that I use the %a and %m macros to load smb.conf extensions
- +particular to machines and architectures. This gives me a lot of
- +flexibility in how I handle each of the machines.
- +
- diff -u -r --new-file last-version/source/change-log samba-1.9.14alpha4/source/change-log
- --- last-version/source/change-log Sat Jul 1 01:12:19 1995
- +++ samba-1.9.14alpha4/source/change-log Sat Jul 1 15:05:38 1995
- @@ -1471,6 +1471,10 @@
- - aix qconfig parsing from Jean-Pierre.Boulard@univ-rennes1.fr
- - more long_date fixups
- - added wildcards to nmbd
- + - extensive changes to ipc.c and miscellaneous other changes
- + from ad@papyrus.hamburg.com (Andreas Degert). Should especially
- + help OS/2 users
- +
-
- ==========
- todo:
- diff -u -r --new-file last-version/source/ipc.c samba-1.9.14alpha4/source/ipc.c
- --- last-version/source/ipc.c Thu Jun 29 18:18:16 1995
- +++ samba-1.9.14alpha4/source/ipc.c Sat Jul 1 14:58:44 1995
- @@ -17,11 +17,11 @@
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- -*/
- + */
- /*
- This file handles the named pipe and mailslot calls
- in the SMBtrans protocol
- -*/
- + */
-
-
- #include "includes.h"
- @@ -33,6 +33,7 @@
- extern files_struct Files[];
-
- extern fstring local_machine;
- +extern BOOL lpq_cache_reset;
-
- #define NERR_Success 0
- #define NERR_badpass 86
- @@ -40,14 +41,74 @@
-
- #define NERR_BASE (2100)
- #define NERR_BufTooSmall (NERR_BASE+23)
- +#define NERR_JobNotFound (NERR_BASE+51)
- +#define NERR_DestNotFound (NERR_BASE+52)
- +#define ERROR_INVALID_LEVEL 124
- +#define ERROR_MORE_DATA 234
- +
- +#define REALLOC(ptr,size) Realloc(ptr,MAX((size),4*1024))
- +
- +#define ACCESS_READ 0x01
- +#define ACCESS_WRITE 0x02
- +#define ACCESS_CREATE 0x04
- +
- +#define STYPE_DISKTREE 0 /* Disk drive */
- +#define STYPE_PRINTQ 1 /* Spooler queue */
- +#define STYPE_DEVICE 2 /* Serial device */
- +#define STYPE_IPC 3 /* Interprocess communication (IPC) */
- +
- +#define SHPWLEN 8 /* share password length */
- +#define NNLEN 12 /* 8.3 net name length */
- +#define SNLEN 15 /* service name length */
- +#define QNLEN 12 /* queue name maximum length */
-
- -#define REALLOC(ptr,size) Realloc(ptr,MAX((size),1024))
- +static int CopyExpanded(int cnum, int snum, char** dst, char* src, int* n)
- +{
- + pstring buf;
- + int l;
- + strcpy(buf,src);
- + string_sub(buf,"%S",lp_servicename(snum));
- + standard_sub(cnum,buf);
- + StrnCpy(*dst,buf,*n);
- + l = strlen(*dst) + 1;
- + *dst += l;
- + *n -= l;
- + return l;
- +}
- +
- +static int CopyAndAdvance(char** dst, char* src, int* n)
- +{
- + int l;
- + StrnCpy(*dst,src,*n);
- + l = strlen(*dst) + 1;
- + *dst += l;
- + *n -= l;
- + return l;
- +}
- +
- +static int StrlenExpanded(int cnum, int snum, char* s)
- +{
- + pstring buf;
- + strcpy(buf,s);
- + string_sub(buf,"%S",lp_servicename(snum));
- + standard_sub(cnum,buf);
- + return strlen(buf) + 1;
- +}
- +
- +static char* Expand(int cnum, int snum, char* s)
- +{
- + static pstring buf;
- + strcpy(buf,s);
- + string_sub(buf,"%S",lp_servicename(snum));
- + standard_sub(cnum,buf);
- + return buf;
- +}
-
- /****************************************************************************
- -send a trans reply
- -****************************************************************************/
- + send a trans reply
- + ****************************************************************************/
- static void send_trans_reply(char *outbuf,char *data,char *param,uint16 *setup,
- - int ldata,int lparam,int lsetup)
- + int ldata,int lparam,int lsetup)
- {
- int i;
- int this_ldata,this_lparam;
- @@ -115,295 +176,693 @@
-
-
- /****************************************************************************
- -get a print queue
- -Normal form: (uLevel=2) <zWrLh> <B13BWWWzzzzzWN>
- -Alternate (uLevel=0): <zWrLh> <B13>
- -****************************************************************************/
- + get a print queue
- + ****************************************************************************/
- +
- +struct pack_desc {
- + char* format; /* formatstring for structure */
- + char* subformat; /* subformat for structure */
- + char* base; /* baseaddress of buffer */
- + int buflen; /* remaining size for fixed part; on init: length of base */
- + int subcount; /* count of substructures */
- + char* structbuf; /* pointer into buffer for remaining fixed part */
- + int stringlen; /* remaining size for variable part */
- + char* stringbuf; /* pointer into buffer for remaining variable part */
- + int neededlen; /* total needed size */
- + int usedlen; /* total used size (usedlen <= neededlen and usedlen <= buflen) */
- + char* curpos; /* current position; pointer into format or subformat */
- + int errcode;
- +};
- +
- +static int get_counter(char** p)
- +{
- + int i, n;
- + if (!isdigit(**p)) return 1;
- + for (n = 0;;) {
- + i = **p;
- + if (isdigit(i))
- + n = 10 * n + (i - '0');
- + else
- + return n;
- + (*p)++;
- + }
- +}
- +
- +static int getlen(char* p)
- +{
- + int n = 0;
- + while (*p) {
- + switch( *p++ ) {
- + case 'W': /* word (2 byte) */
- + n += 2;
- + break;
- + case 'N': /* count of substructures (word) at end */
- + n += 2;
- + break;
- + case 'D': /* double word (4 byte) */
- + case 'z': /* offset to zero terminated string (4 byte) */
- + case 'l': /* offset to user data (4 byte) */
- + n += 4;
- + break;
- + case 'b': /* offset to data (with counter) (4 byte) */
- + n += 4;
- + get_counter(&p);
- + break;
- + case 'B': /* byte (with optional counter) */
- + n += get_counter(&p);
- + break;
- + }
- + }
- + return n;
- +}
- +
- +static void init_package(struct pack_desc* p, int count, int subcount)
- +{
- + int n = p->buflen;
- + int i = count * getlen(p->format);
- + if (p->subformat) i += subcount * getlen(p->subformat);
- + p->structbuf = p->base;
- + p->neededlen = 0;
- + p->usedlen = 0;
- + p->subcount = 0;
- + p->curpos = p->format;
- + if (i > n) {
- + i = n = 0;
- + p->errcode = NERR_BufTooSmall;
- + }
- + else
- + p->errcode = NERR_Success;
- + p->buflen = i;
- + n -= i;
- + p->stringbuf = p->base + i;
- + p->stringlen = n;
- +}
- +
- +static int package(struct pack_desc* p, ...)
- +{
- + va_list args;
- + int needed=0, stringneeded;
- + char* str=NULL;
- + int is_string=0, stringused;
- + va_start(args,p);
- + if (!*p->curpos) {
- + if (!p->subcount)
- + p->curpos = p->format;
- + else {
- + p->curpos = p->subformat;
- + p->subcount--;
- + }
- + }
- + #if CHECK_TYPES
- + str = va_arg(args,char*);
- + if (strncmp(str,p->curpos,strlen(str)) != 0) {
- + DEBUG(2,("type error in package: %s instead of %*s in %s/%s\n",str,
- + strlen(str),p->curpos,p->format1,p->format2));
- + return 0;
- + }
- + #endif
- + stringneeded = -1;
- + switch( *p->curpos++ ) {
- + case 'W': /* word (2 byte) */
- + needed = 2;
- + if (p->buflen >= needed) SSVAL(p->structbuf,0,va_arg(args,int16));
- + break;
- + case 'N': /* count of substructures (word) at end */
- + needed = 2;
- + p->subcount = va_arg(args,int16);
- + if (p->buflen >= needed) SSVAL(p->structbuf,0,p->subcount);
- + break;
- + case 'D': /* double word (4 byte) */
- + needed = 4;
- + if (p->buflen >= needed) SIVAL(p->structbuf,0,va_arg(args,int32));
- + break;
- + case 'B': /* byte (with optional counter) */
- + needed = get_counter(&p->curpos);
- + if (p->buflen >= needed) StrnCpy(p->structbuf,va_arg(args,char*),needed);
- + break;
- + case 'z': /* offset to zero terminated string (4 byte) */
- + str = va_arg(args,char*);
- + stringneeded = (str ? strlen(str)+1 : 0);
- + is_string = 1;
- + break;
- + case 'l': /* offset to user data (4 byte) */
- + str = va_arg(args,char*);
- + stringneeded = va_arg(args,int);
- + is_string = 0;
- + break;
- + case 'b': /* offset to data (with counter) (4 byte) */
- + str = va_arg(args,char*);
- + stringneeded = get_counter(&p->curpos);
- + is_string = 0;
- + break;
- + }
- + va_end(args);
- + if (stringneeded >= 0) {
- + needed = 4;
- + if (p->buflen >= needed) {
- + stringused = stringneeded;
- + if (stringused > p->stringlen) {
- + stringused = (is_string ? p->stringlen : 0);
- + if (p->errcode == NERR_Success) p->errcode = ERROR_MORE_DATA;
- + }
- + if (!stringused)
- + SIVAL(p->structbuf,0,0);
- + else {
- + SIVAL(p->structbuf,0,PTR_DIFF(p->stringbuf,p->base));
- + memcpy(p->stringbuf,str,stringused);
- + if (is_string) p->stringbuf[stringused-1] = '\0';
- + p->stringbuf += stringused;
- + p->stringlen -= stringused;
- + p->usedlen += stringused;
- + }
- + }
- + p->neededlen += stringneeded;
- + }
- + p->neededlen += needed;
- + if (p->buflen >= needed) {
- + p->structbuf += needed;
- + p->buflen -= needed;
- + p->usedlen += needed;
- + }
- + else {
- + if (p->errcode == NERR_Success) p->errcode = NERR_BufTooSmall;
- + }
- + return 1;
- +}
- +
- +#if CHECK_TYPES
- +#define PACK(desc,t,v) package(desc,t,v)
- +#define PACKl(desc,t,v,l) package(desc,t,v,l)
- +#else
- +#define PACK(desc,t,v) package(desc,v)
- +#define PACKl(desc,t,v,l) package(desc,v,l)
- +#endif
- +
- +static void PackDriverData(struct pack_desc* desc)
- +{
- + char drivdata[4+4+32];
- + SIVAL(drivdata,0,sizeof drivdata); /* cb */
- + SIVAL(drivdata,4,1000); /* lVersion */
- + memset(drivdata+8,0,32); /* szDeviceName */
- + strcpy(drivdata+8,"IBMNULL");
- + PACKl(desc,"l",drivdata,sizeof drivdata); /* pDriverData */
- +}
- +
- +static int check_printq_info(struct pack_desc* desc,
- + int uLevel, const char* id1, const char* id2)
- +{
- + desc->subformat = NULL;
- + switch( uLevel ) {
- + case 0:
- + desc->format = "B13";
- + break;
- + case 1:
- + desc->format = "B13BWWWzzzzzWW";
- + break;
- + case 2:
- + desc->format = "B13BWWWzzzzzWN";
- + desc->subformat = "WB21BB16B10zWWzDDz";
- + break;
- + case 3:
- + desc->format = "zWWWWzzzzWWzzl";
- + break;
- + case 4:
- + desc->format = "zWWWWzzzzWNzzl";
- + desc->subformat = "WWzWWDDzz";
- + break;
- + case 5:
- + desc->format = "z";
- + break;
- + default: return False;
- + }
- + if (strcmp(desc->format,id1) != 0) return False;
- + if (desc->subformat && strcmp(desc->subformat,id2) != 0) return False;
- + return True;
- +}
- +
- +static void fill_printjob_info(int cnum, int snum, int uLevel,
- + struct pack_desc* desc,
- + print_queue_struct* queue, int n)
- +{
- + PACK(desc,"W",((snum%0xFF)<<8) | (queue->job%0xFF)); /* uJobId */
- + if (uLevel == 1) {
- + PACK(desc,"B21",queue->user); /* szUserName */
- + PACK(desc,"B",0); /* pad */
- + PACK(desc,"B16",""); /* szNotifyName */
- + PACK(desc,"B10","PM_Q_RAW"); /* szDataType */
- + PACK(desc,"z",""); /* pszParms */
- + PACK(desc,"W",n+1); /* uPosition */
- + PACK(desc,"W",queue->status); /* fsStatus */
- + PACK(desc,"z",""); /* pszStatus */
- + PACK(desc,"D",queue->time); /* ulSubmitted */
- + PACK(desc,"D",queue->size); /* ulSize */
- + PACK(desc,"z",queue->file); /* pszComment */
- + }
- + if (uLevel == 2 || uLevel == 3) {
- + PACK(desc,"W",50); /* uPriority */
- + PACK(desc,"z",queue->user); /* pszUserName */
- + PACK(desc,"W",n+1); /* uPosition */
- + PACK(desc,"W",queue->status); /* fsStatus */
- + PACK(desc,"D",queue->time); /* ulSubmitted */
- + PACK(desc,"D",queue->size); /* ulSize */
- + PACK(desc,"z","Samba"); /* pszComment */
- + PACK(desc,"z",queue->file); /* pszDocument */
- + if (uLevel == 3) {
- + PACK(desc,"z",""); /* pszNotifyName */
- + PACK(desc,"z","PM_Q_RAW"); /* pszDataType */
- + PACK(desc,"z",""); /* pszParms */
- + PACK(desc,"z",""); /* pszStatus */
- + PACK(desc,"z",SERVICE(snum)); /* pszQueue */
- + PACK(desc,"z","lpd"); /* pszQProcName */
- + PACK(desc,"z",""); /* pszQProcParms */
- + PACK(desc,"z","IBMNULL"); /* pszDriverName */
- + PackDriverData(desc); /* pDriverData */
- + PACK(desc,"z",""); /* pszPrinterName */
- + }
- + }
- +}
- +
- +static void fill_printq_info(int cnum, int snum, int uLevel,
- + struct pack_desc* desc,
- + int count, print_queue_struct* queue,
- + print_status_struct* status)
- +{
- + if (uLevel < 3)
- + PACK(desc,"B13",SERVICE(snum));
- + else
- + PACK(desc,"z",Expand(cnum,snum,SERVICE(snum)));
- + if (uLevel == 1 || uLevel == 2) {
- + PACK(desc,"B",0); /* alignment */
- + PACK(desc,"W",5); /* priority */
- + PACK(desc,"W",0); /* start time */
- + PACK(desc,"W",0); /* until time */
- + PACK(desc,"z",""); /* pSepFile */
- + PACK(desc,"z","lpd"); /* pPrProc */
- + PACK(desc,"z",SERVICE(snum)); /* pDestinations */
- + PACK(desc,"z",0); /* pParms */
- + if (snum < 0) {
- + PACK(desc,"z","UNKNOWN PRINTER");
- + PACK(desc,"W",LPSTAT_ERROR);
- + }
- + else if (!status->message[0]) {
- + PACK(desc,"z",Expand(cnum,snum,lp_comment(snum)));
- + PACK(desc,"W",LPSTAT_OK); /* status */
- + }
- + else {
- + PACK(desc,"z",status->message);
- + PACK(desc,"W",status->status); /* status */
- + }
- + PACK(desc,(uLevel == 1 ? "W" : "N"),count);
- + }
- + if (uLevel == 3 || uLevel == 4) {
- + PACK(desc,"W",5); /* uPriority */
- + PACK(desc,"W",0); /* uStarttime */
- + PACK(desc,"W",0); /* uUntiltime */
- + PACK(desc,"W",5); /* pad1 */
- + PACK(desc,"z",""); /* pszSepFile */
- + PACK(desc,"z","lpd"); /* pszPrProc */
- + PACK(desc,"z",""); /* pszParms */
- + if (!status->message[0]) {
- + PACK(desc,"z",Expand(cnum,snum,lp_comment(snum))); /* pszComment */
- + PACK(desc,"W",LPSTAT_OK); /* fsStatus */
- + }
- + else {
- + PACK(desc,"z",status->message); /* pszComment */
- + PACK(desc,"W",status->status); /* fsStatus */
- + }
- + PACK(desc,(uLevel == 3 ? "W" : "N"),count); /* cJobs */
- + PACK(desc,"z",SERVICE(snum)); /* pszPrinters */
- + PACK(desc,"z","IBMNULL"); /* pszDriverName */
- + PackDriverData(desc); /* pDriverData */
- + }
- + if (uLevel == 2 || uLevel == 4) {
- + int i;
- + for (i=0;i<count;i++)
- + fill_printjob_info(cnum,snum,uLevel == 2 ? 1 : 2,desc,&queue[i],i);
- + }
- +
- + DEBUG(3,("fill_printq_info on <%s> gave %d entries\n",SERVICE(snum),count));
- +}
- +
- static BOOL api_DosPrintQGetInfo(int cnum,char *param,char *data,
- - int mdrcnt,int mprcnt,
- - char **rdata,char **rparam,
- - int *rdata_len,int *rparam_len)
- + int mdrcnt,int mprcnt,
- + char **rdata,char **rparam,
- + int *rdata_len,int *rparam_len)
- {
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- char *QueueName = p;
- int uLevel,cbBuf;
- - int count=0;
- - int i;
- - print_queue_struct *queue=NULL;
- - char *p2=NULL;
- + int count;
- int snum;
- + char* str3;
- + struct pack_desc desc;
- + print_queue_struct *queue=NULL;
- print_status_struct status;
- -
- - status.message = NULL;
- -
- +
- + bzero(&status,sizeof(status));
- +
- p = skip_string(p,1);
- uLevel = SVAL(p,0);
- cbBuf = SVAL(p,2);
- -
- - if ((p = strchr(QueueName,'%')))
- - *p = 0;
- -
- + str3 = p + 4;
- +
- + if ((p = strchr(QueueName,'%'))) *p = 0;
- +
- DEBUG(3,("PrintQueue uLevel=%d name=%s\n",uLevel,QueueName));
- -
- +
- /* check it's a supported varient */
- - if (!
- - ((uLevel==2 && strcsequal(str1,"zWrLh") && strcsequal(str2,"B13BWWWzzzzzWN")) ||
- - (uLevel==1 && strcsequal(str1,"zWrLh") && strcsequal(str2,"B13BWWWzzzzzWW")) ||
- - (uLevel==3 && strcsequal(str1,"zWrLh") && strcsequal(str2,"zWWWWzzzzWWzzl")) ||
- - (uLevel==0 && strcsequal(str1,"zWrLh") && strcsequal(str2,"B13"))))
- - return(False);
- -
- + if (strcmp(str1,"zWrLh") != 0) return False;
- + if (!check_printq_info(&desc,uLevel,str2,str3)) return False;
- +
- snum = lp_servicenumber(QueueName);
- - if (snum < 0 && pcap_printername_ok(QueueName,NULL))
- - {
- - int pnum = lp_servicenumber(PRINTERS_NAME);
- - if (pnum >= 0)
- - {
- - lp_add_printer(QueueName,pnum);
- - snum = lp_servicenumber(QueueName);
- - }
- + if (snum < 0 && pcap_printername_ok(QueueName,NULL)) {
- + int pnum = lp_servicenumber(PRINTERS_NAME);
- + if (pnum >= 0) {
- + lp_add_printer(QueueName,pnum);
- + snum = lp_servicenumber(QueueName);
- }
- -
- + }
- +
- + count = get_printqueue(snum,cnum,&queue,&status);
- + if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- + desc.base = *rdata;
- + desc.buflen = mdrcnt;
- + init_package(&desc,1,count);
- + desc.subcount = count;
- + fill_printq_info(cnum,snum,uLevel,&desc,count,queue,&status);
- + *rdata_len = desc.usedlen;
- +
- + *rparam_len = 6;
- + *rparam = REALLOC(*rparam,*rparam_len);
- + SSVALS(*rparam,0,desc.errcode);
- + SSVAL(*rparam,2,0);
- + SSVAL(*rparam,4,desc.neededlen);
- +
- + DEBUG(4,("printqgetinfo: errorcode %d\n",desc.errcode));
-
- - /* go and get the actual queue entries */
- - if (snum >= 0 && uLevel >= 1)
- - count = get_printqueue(snum,cnum,&queue,&status);
- + if (queue) free(queue);
- +
- + return(True);
- +}
-
- - /* don't return too many entries for the buffer */
- - if (uLevel != 1)
- - {
- - count = MIN(count,(mdrcnt-(44+50))/94);
- - count = MAX(count,0);
- - }
-
- - *rparam_len = 6;
- +/****************************************************************************
- + view list of all print jobs on all queues
- + ****************************************************************************/
- +static BOOL api_DosPrintQEnum(int cnum, char* param, char* data,
- + int mdrcnt, int mprcnt,
- + char **rdata, char** rparam,
- + int *rdata_len, int *rparam_len)
- +{
- + char *param_format = param+2;
- + char *output_format1 = skip_string(param_format,1);
- + char *p = skip_string(output_format1,1);
- + int uLevel = SVAL(p,0);
- + char *output_format2 = p + 4;
- + int services = lp_numservices();
- + int i, n;
- + struct pack_desc desc;
- + print_queue_struct **queue = NULL;
- + print_status_struct *status = NULL;
- + int* subcntarr = NULL;
- + int queuecnt, subcnt=0, succnt;
- +
- + DEBUG(3,("DosPrintQEnum uLevel=%d\n",uLevel));
- +
- + if (strcmp(param_format,"WrLeh") != 0) return False;
- + if (!check_printq_info(&desc,uLevel,output_format1,output_format2))
- + return False;
- + queuecnt = 0;
- + for (i = 0; i < services; i++)
- + if (lp_print_ok(i) && lp_browseable(i))
- + queuecnt++;
- + if (uLevel > 0) {
- + queue = (print_queue_struct**)malloc(queuecnt*sizeof(print_queue_struct*));
- + memset(queue,0,queuecnt*sizeof(print_queue_struct*));
- + status = (print_status_struct*)malloc(queuecnt*sizeof(print_status_struct));
- + memset(status,0,queuecnt*sizeof(print_status_struct));
- + subcntarr = (int*)malloc(queuecnt*sizeof(int));
- + subcnt = 0;
- + n = 0;
- + for (i = 0; i < services; i++)
- + if (lp_print_ok(i) && lp_browseable(i)) {
- + subcntarr[n] = get_printqueue(i,cnum,&queue[n],&status[n]);
- + subcnt += subcntarr[n];
- + n++;
- + }
- + }
- + if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- + desc.base = *rdata;
- + desc.buflen = mdrcnt;
- + init_package(&desc,queuecnt,subcnt);
- + n = 0;
- + succnt = 0;
- + for (i = 0; i < services; i++)
- + if (lp_print_ok(i) && lp_browseable(i)) {
- + fill_printq_info(cnum,i,uLevel,&desc,subcntarr[n],queue[n],&status[n]);
- + n++;
- + if (desc.errcode == NERR_Success) succnt = n;
- + }
- + if (subcntarr) free(subcntarr);
- +
- + *rdata_len = desc.usedlen;
- + *rparam_len = 8;
- *rparam = REALLOC(*rparam,*rparam_len);
- + SSVALS(*rparam,0,desc.errcode);
- + SSVAL(*rparam,2,0);
- + SSVAL(*rparam,4,succnt);
- + SSVAL(*rparam,6,queuecnt);
- +
- + for (i = 0; i < queuecnt; i++) {
- + if (queue && queue[i]) free(queue[i]);
- + }
-
- - switch (uLevel)
- - {
- - case 0:
- - *rdata_len = 13;
- - *rdata = REALLOC(*rdata,*rdata_len);
- - p2 = (*rdata) + (*rdata_len);
- - SSVALS(*rparam,0,NERR_Success); /* 0x84b */
- - SSVAL(*rparam,2,0);
- - SSVAL(*rparam,4,13);
- - break;
- + if (queue) free(queue);
- + if (status) free(status);
- +
- + return True;
- +}
-
- - case 1:
- - *rdata_len = 13 + 1 + 30;
- - *rdata = REALLOC(*rdata,*rdata_len + 100);
- -
- - p2 = (*rdata) + 44;
- -
- - SSVAL(*rparam,0,NERR_Success);
- - SSVAL(*rparam,2,0); /* converter word */
- - SSVAL(*rparam,4,*rdata_len); /* length of rdata struct */
- - break;
- - case 2:
- - *rdata_len = 13 + 1 + 30;
- - *rdata = REALLOC(*rdata,*rdata_len + 100 + count*(74+40));
- -
- - p2 = (*rdata) + 44 + count*74; /* auxillery data (strings)
- - will go here */
- -
- - SSVAL(*rparam,0,NERR_Success);
- - SSVAL(*rparam,2,0); /* converter word */
- - SSVAL(*rparam,4,*rdata_len); /* length of rdata struct */
- - break;
- - case 3:
- - *rdata_len = 0;
- - p2 = (*rdata) + (*rdata_len);
- - SSVALS(*rparam,0,0x7c);
- - SSVAL(*rparam,2,0x70);
- - SSVAL(*rparam,4,0);
- - break;
- - }
- +/****************************************************************************
- + get info about a share
- + ****************************************************************************/
-
- - p = *rdata;
- +static int check_share_info(int uLevel, const char* id)
- +{
- + switch( uLevel ) {
- + case 0:
- + if (strcmp(id,"B13") != 0) return False;
- + break;
- + case 1:
- + if (strcmp(id,"B13BWz") != 0) return False;
- + break;
- + case 2:
- + if (strcmp(id,"B13BWzWWWzB9B") != 0) return False;
- + break;
- + case 91:
- + if (strcmp(id,"B13BWzWWWzB9BB9BWzWWzWW") != 0) return False;
- + break;
- + default: return False;
- + }
- + return True;
- +}
-
- - if (uLevel <= 2)
- +static int fill_share_info(int cnum, int snum, int uLevel,
- + char** buf, int* buflen,
- + char** stringbuf, int* stringspace, char* baseaddr)
- +{
- + int struct_len;
- + char* p;
- + char* p2;
- + int l2;
- + int len;
- +
- + switch( uLevel ) {
- + case 0: struct_len = 13; break;
- + case 1: struct_len = 20; break;
- + case 2: struct_len = 40; break;
- + case 91: struct_len = 68; break;
- + default: return -1;
- + }
- +
- +
- + if (!buf)
- {
- - StrnCpy(p,QueueName,13);
- - p += 13;
- + len = 0;
- + if (uLevel > 0) len += StrlenExpanded(cnum,snum,lp_comment(snum));
- + if (uLevel > 1) len += strlen(lp_pathname(snum)) + 1;
- + if (buflen) *buflen = struct_len;
- + if (stringspace) *stringspace = len;
- + return struct_len + len;
- }
- -
- - if (uLevel == 2 || uLevel == 1)
- +
- + len = struct_len;
- + p = *buf;
- + if (*buflen < struct_len) return -1;
- + if (stringbuf)
- {
- - p++; /* skip the pad byte */
- - SSVAL(p,0,0); /* priority */
- - SSVAL(p,2,0); /* start time */
- - SSVAL(p,4,0); /* until time */
- - SIVAL(p,6,0); /* pSepFile */
- - SIVAL(p,10,0); /* pPrProc */
- - SIVAL(p,14,0); /* pDestinations */
- - SIVAL(p,18,0); /* pParms */
- -
- - SIVAL(p,22,PTR_DIFF(p2,*rdata)); /* pComment */
- - if (snum < 0) {
- - strcpy(p2,"UNKNOWN PRINTER");
- - } else {
- - if (!status.message) {
- - pstring comment;
- - strcpy(comment,lp_comment(snum));
- - string_sub(comment,"%S",lp_servicename(snum));
- - standard_sub(cnum,comment);
- - StrnCpy(p2,comment,40);
- - SSVAL(p,26,LPSTAT_OK); /* status */
- - } else {
- - StrnCpy(p2,status.message,40);
- - SSVAL(p,26,status.status); /* status */
- - }
- - }
- -
- - p2 = skip_string(p2,1);
- -
- - SSVAL(p,28,count); /* num jobs */
- - p += 30;
- + p2 = *stringbuf;
- + l2 = *stringspace;
- }
- -
- - if (status.message) {
- - free(status.message);
- - status.message = NULL;
- - }
- -
- - if (uLevel == 2)
- - for (i=0;i<count;i++)
- + else
- {
- - /* we encode the snum and job number in this way so we can extract
- - then both for a print queue del operation */
- - SSVAL(p,0,((snum%0xFF)<<8) | (queue[i].job%0xFF));
- - StrnCpy(p+2,queue[i].user,21);
- - StrnCpy(p+24,"",16); /* notify name */
- - StrnCpy(p+40,"",10); /* data type */
- - SIVAL(p,50,0); /* pParams */
- - SSVAL(p,54,i); /* position */
- - SSVAL(p,56,queue[i].status); /* status */
- - SIVAL(p,58,0); /* pStatus string */
- - SIVAL(p,62,queue[i].time); /* submit time */
- - SIVAL(p,66,queue[i].size); /* job size */
- -
- - SIVAL(p,70,PTR_DIFF(p2,*rdata));
- - StrnCpy(p2,queue[i].file,39);
- - p2 = skip_string(p2,1);
- -
- - p += 74;
- + p2 = p + struct_len;
- + l2 = *buflen - struct_len;
- }
- -
- - *rdata_len = PTR_DIFF(p2,*rdata);
- -
- - if (queue) free(queue);
- + if (!baseaddr) baseaddr = p;
- +
- + StrnCpy(p,lp_servicename(snum),13);
- +
- + if (uLevel > 0)
- + {
- + int type;
- + CVAL(p,13) = 0;
- + type = STYPE_DISKTREE;
- + if (lp_print_ok(snum)) type = STYPE_PRINTQ;
- + if (strequal("IPC$",lp_servicename(snum))) type = STYPE_IPC;
- + SSVAL(p,14,type); /* device type */
- + SIVAL(p,16,PTR_DIFF(p2,baseaddr));
- + len += CopyExpanded(cnum,snum,&p2,lp_comment(snum),&l2);
- + }
- +
- + if (uLevel > 1)
- + {
- + SSVAL(p,20,ACCESS_READ|ACCESS_WRITE|ACCESS_CREATE); /* permissions */
- + SSVAL(p,22,-1); /* max uses */
- + SSVAL(p,24,1); /* current uses */
- + SIVAL(p,26,PTR_DIFF(p2,baseaddr)); /* local pathname */
- + len += CopyAndAdvance(&p2,lp_pathname(snum),&l2);
- + memset(p+30,0,SHPWLEN+2); /* passwd (reserved), pad field */
- + }
- +
- + if (uLevel > 2)
- + {
- + memset(p+40,0,SHPWLEN+2);
- + SSVAL(p,50,0);
- + SIVAL(p,52,0);
- + SSVAL(p,56,0);
- + SSVAL(p,58,0);
- + SIVAL(p,60,0);
- + SSVAL(p,64,0);
- + SSVAL(p,66,0);
- + }
- +
- + if (stringbuf)
- + {
- + *buf = p + struct_len;
- + *buflen -= struct_len;
- + *stringbuf = p2;
- + *stringspace = l2;
- + }
- + else
- + {
- + *buf = p2;
- + *buflen -= len;
- + }
- + return len;
- +}
-
- - DEBUG(3,("DosPrintQGetInfo on <%s> gave %d entries\n",QueueName,count));
- +static BOOL api_RNetShareGetInfo(int cnum,char *param,char *data,
- + int mdrcnt,int mprcnt,
- + char **rdata,char **rparam,
- + int *rdata_len,int *rparam_len)
- +{
- + char *str1 = param+2;
- + char *str2 = skip_string(str1,1);
- + char *netname = skip_string(str2,1);
- + char *p = skip_string(netname,1);
- + int uLevel = SVAL(p,0);
- + int snum = find_service(netname);
- +
- + if (snum < 0) return False;
- +
- + /* check it's a supported varient */
- + if (strcmp(str1,"zWrLh") != 0) return False;
- + if (!check_share_info(uLevel,str2)) return False;
- +
- + *rdata = REALLOC(*rdata,mdrcnt);
- + p = *rdata;
- + *rdata_len = fill_share_info(cnum,snum,uLevel,&p,&mdrcnt,0,0,0);
- + if (*rdata_len < 0) return False;
- +
- + *rparam_len = 6;
- + *rparam = REALLOC(*rparam,*rparam_len);
- + SSVAL(*rparam,0,NERR_Success);
- + SSVAL(*rparam,2,0); /* converter word */
- + SSVAL(*rparam,4,*rdata_len);
- +
- return(True);
- }
-
- -
- /****************************************************************************
- -view list of shares available
- -expect: WrLeh B13BWz
- -
- -NOTE: SEGV has been reported inside this routine. It needs to be investigated.
- -****************************************************************************/
- + view list of shares available
- + ****************************************************************************/
- static BOOL api_RNetShareEnum(int cnum,char *param,char *data,
- - int mdrcnt,int mprcnt,
- - char **rdata,char **rparam,
- - int *rdata_len,int *rparam_len)
- + int mdrcnt,int mprcnt,
- + char **rdata,char **rparam,
- + int *rdata_len,int *rparam_len)
- {
- - char *p = skip_string(param+2,2);
- - int level = SVAL(p,0);
- + char *str1 = param+2;
- + char *str2 = skip_string(str1,1);
- + char *p = skip_string(str2,1);
- + int uLevel = SVAL(p,0);
- int buf_len = SVAL(p,2);
- char *p2;
- int count=lp_numservices();
- int total=0,counted=0;
- - int comment_len=0;
- int i;
- - BOOL squeezed = False;
- -
- + int data_len, fixed_len, string_len;
- + int f_len, s_len;
- +
- + if (strcmp(str1,"WrLeh") != 0) return False;
- + if (!check_share_info(uLevel,str2)) return False;
- +
- + data_len = fixed_len = string_len = 0;
- for (i=0;i<count;i++)
- if (lp_browseable(i))
- {
- - pstring s;
- - strcpy(s,lp_comment(i));
- - string_sub(s,"%S",lp_servicename(i));
- - standard_sub(cnum,s);
- - total++;
- - comment_len += strlen(s) + 1;
- + total++;
- + data_len += fill_share_info(cnum,i,uLevel,0,&f_len,0,&s_len,0);
- + if (data_len <= buf_len)
- + {
- + counted++;
- + fixed_len += f_len;
- + string_len += s_len;
- + }
- }
- -
- - *rparam_len = 8;
- - *rparam = REALLOC(*rparam,*rparam_len);
- -
- - *rdata_len = total*20 + comment_len;
- + *rdata_len = fixed_len + string_len;
- *rdata = REALLOC(*rdata,*rdata_len);
- - bzero(*rdata,*rdata_len);
- -
- - total = MIN(total,buf_len/25);
- -
- - p2 = (*rdata) + total*20; /* auxillery data (strings) will go here */
- -
- + memset(*rdata,0,*rdata_len);
- +
- + p2 = (*rdata) + fixed_len; /* auxillery data (strings) will go here */
- p = *rdata;
- -
- - for (i=0;i<count && counted<total;i++)
- + f_len = fixed_len;
- + s_len = string_len;
- + for (i = 0; i < count;i++)
- if (lp_browseable(i))
- - {
- - int type = 0;
- -
- - if (lp_print_ok(i)) type = 1;
- - if (strequal("IPC$",lp_servicename(i))) type = 3;
- -
- - StrnCpy(p,lp_servicename(i),12);
- - CVAL(p,13) = 0; /* pad */
- - SSVAL(p,14,type); /* device type */
- - SIVAL(p,16,PTR_DIFF(p2,(*rdata)));
- - strcpy(p2,lp_comment(i));
- - string_sub(p2,"%S",lp_servicename(i));
- - standard_sub(cnum,p2);
- -
- - if (!squeezed &&
- - PTR_DIFF(skip_string(p2,1),*rdata) < (buf_len-2))
- - p2 = skip_string(p2,1);
- - else
- - squeezed = True;
- -
- - p += 20;
- - counted++;
- - }
- -
- -
- - if (squeezed)
- - {
- - strcpy(p2,"-");
- - p2 += 2;
- - }
- -
- - if (counted < total)
- - {
- - memmove((*rdata) + counted*20,(*rdata) + total*20,
- - PTR_DIFF(p2,(*rdata) + total*20)+2);
- - p2 -= (total-counted)*20;
- - }
- -
- - *rdata_len = PTR_DIFF(p2,(*rdata));
- -
- + if (fill_share_info(cnum,i,uLevel,&p,&f_len,&p2,&s_len,*rdata) < 0)
- + break;
- +
- + *rparam_len = 8;
- + *rparam = REALLOC(*rparam,*rparam_len);
- SSVAL(*rparam,0,NERR_Success);
- - SSVAL(*rparam,2,(total-counted)*20); /* converter word */
- + SSVAL(*rparam,2,0);
- SSVAL(*rparam,4,counted);
- SSVAL(*rparam,6,total);
- -
- +
- DEBUG(3,("RNetShareEnum gave %d entries of %d (%d %d %d %d)\n",
- - counted,total,level,
- - buf_len,*rdata_len,mdrcnt));
- + counted,total,uLevel,
- + buf_len,*rdata_len,mdrcnt));
- return(True);
- }
-
-
-
- /****************************************************************************
- -get the time of day info
- -****************************************************************************/
- + get the time of day info
- + ****************************************************************************/
- static BOOL api_NetRemoteTOD(int cnum,char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- @@ -417,7 +876,7 @@
- *rdata = REALLOC(*rdata,*rdata_len);
-
- SSVAL(*rparam,0,NERR_Success);
- - SSVAL(*rparam,2,0); /* converter word */
- + SSVAL(*rparam,2,0); /* converter word */
-
- p = *rdata;
-
- @@ -428,16 +887,16 @@
- t = LocalTime(&unixdate,0);
-
- SIVAL(p,0,unixdate);
- - SIVAL(p,4,0); /* msecs ? */
- + SIVAL(p,4,0); /* msecs ? */
- CVAL(p,8) = t->tm_hour;
- CVAL(p,9) = t->tm_min;
- CVAL(p,10) = t->tm_sec;
- - CVAL(p,11) = 0; /* hundredths of seconds */
- + CVAL(p,11) = 0; /* hundredths of seconds */
- SSVAL(p,12,TimeDiff(0)/60); /* timezone in minutes from GMT */
- - SSVAL(p,14,10000); /* timer interval in 0.0001 of sec */
- + SSVAL(p,14,10000); /* timer interval in 0.0001 of sec */
- CVAL(p,16) = t->tm_mday;
- CVAL(p,17) = t->tm_mon + 1;
- - SSVAL(p,18,t->tm_year);
- + SSVAL(p,18,1900+t->tm_year);
- CVAL(p,20) = t->tm_wday;
- }
-
- @@ -446,8 +905,8 @@
- }
-
- /****************************************************************************
- -set the user password
- -****************************************************************************/
- + set the user password
- + ****************************************************************************/
- static BOOL api_SetUserPassword(int cnum,char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- @@ -468,7 +927,7 @@
- *rdata_len = 0;
-
- SSVAL(*rparam,0,NERR_Success);
- - SSVAL(*rparam,2,0); /* converter word */
- + SSVAL(*rparam,2,0); /* converter word */
-
- DEBUG(3,("Set password for <%s>\n",user));
-
- @@ -482,9 +941,9 @@
- }
-
- /****************************************************************************
- -delete a print job
- -Form: <W> <>
- -****************************************************************************/
- + delete a print job
- + Form: <W> <>
- + ****************************************************************************/
- static BOOL api_RDosPrintJobDel(int cnum,char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- @@ -497,6 +956,7 @@
- by the print queue api */
- int snum = (SVAL(p,0)>>8);
-
- + lpq_cache_reset = True;
-
- /* check it's a supported varient */
- if (!(strcsequal(str1,"W") && strcsequal(str2,"")))
- @@ -508,7 +968,7 @@
- *rdata_len = 0;
-
- SSVAL(*rparam,0,NERR_Success);
- - SSVAL(*rparam,2,0); /* converter word */
- + SSVAL(*rparam,2,0); /* converter word */
-
- if (snum >= 0)
- {
- @@ -531,9 +991,59 @@
- return(True);
- }
-
- +static BOOL api_WPrintQueuePurge(int cnum,char *param,char *data,
- + int mdrcnt,int mprcnt,
- + char **rdata,char **rparam,
- + int *rdata_len,int *rparam_len)
- +{
- + char *str1 = param+2;
- + char *str2 = skip_string(str1,1);
- + char *QueueName = skip_string(str2,1);
- + int snum;
- +
- + lpq_cache_reset = True;
- +
- + /* check it's a supported varient */
- + if (!(strcsequal(str1,"z") && strcsequal(str2,"")))
- + return(False);
- +
- + *rparam_len = 4;
- + *rparam = REALLOC(*rparam,*rparam_len);
- +
- + *rdata_len = 0;
- +
- + SSVAL(*rparam,0,NERR_Success);
- + SSVAL(*rparam,2,0); /* converter word */
- +
- + snum = lp_servicenumber(QueueName);
- + if (snum < 0 && pcap_printername_ok(QueueName,NULL)) {
- + int pnum = lp_servicenumber(PRINTERS_NAME);
- + if (pnum >= 0) {
- + lp_add_printer(QueueName,pnum);
- + snum = lp_servicenumber(QueueName);
- + }
- + }
- +
- + if (snum >= 0) {
- + print_queue_struct *queue=NULL;
- + int i;
- + int count = get_printqueue(snum,cnum,&queue,NULL);
- +
- + for (i = 0; i < count; i++)
- + del_printqueue(cnum,snum,queue[i].job);
- +
- + if (queue) free(queue);
- + }
- +
- + DEBUG(3,("Print queue purge, queue=%s\n",QueueName));
- +
- + return(True);
- +}
- +
- +
- /****************************************************************************
- -set the name of a print job (undocumented?)
- -****************************************************************************/
- + set the name of a print job (undocumented?)
- + ****************************************************************************/
- static BOOL api_PrintJobInfo(int cnum,char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- @@ -544,10 +1054,12 @@
- *rparam_len = 4;
- *rparam = REALLOC(*rparam,*rparam_len);
-
- + lpq_cache_reset = True;
- +
- *rdata_len = 0;
-
- SSVAL(*rparam,0,NERR_Success);
- - SSVAL(*rparam,2,0); /* converter word */
- + SSVAL(*rparam,2,0); /* converter word */
-
- /* now try to extract the name. As I don't really understand this
- API this is mostly guesswork.
- @@ -586,8 +1098,18 @@
-
-
- /****************************************************************************
- -get info about the server (no docs on this one - guesswork only)
- -****************************************************************************/
- + get info about the server
- + ****************************************************************************/
- +
- +#define SV_TYPE_WORKSTATION 0x00000001
- +#define SV_TYPE_SERVER 0x00000002
- +#define SV_TYPE_SQLSERVER 0x00000004
- +#define SV_TYPE_DOMAIN_CTRL 0x00000008
- +#define SV_TYPE_DOMAIN_BAKCTRL 0x00000010
- +#define SV_TYPE_TIME_SOURCE 0x00000020
- +#define SV_TYPE_AFP 0x00000040
- +#define SV_TYPE_NOVELL 0x00000080
- +
- static BOOL api_RNetServerGetInfo(int cnum,char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- @@ -596,71 +1118,82 @@
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- + int uLevel = SVAL(p,0);
- char *p2;
- - pstring comment;
- - int level = SVAL(p,0);
- -
- - DEBUG(4,("RNetServerGetInfo level %d\n",level));
- -
- - *rparam_len = 6;
- - *rparam = REALLOC(*rparam,*rparam_len);
- + int struct_len;
-
- /* check it's a supported varient */
- - if (!(
- - (level==1 && strcsequal(str1,"WrLh") && strcsequal(str2,"B16BBDz")) ||
- - (level==50 && strcsequal(str1,"WrLh") && strcsequal(str2,"B16BBDzWWzzz"))
- - ))
- - return(False);
- -
- - strcpy(comment,lp_serverstring());
- - standard_sub(cnum,comment);
- + if (strcmp(str1,"WrLh") != 0) return False;
- + switch( uLevel ) {
- + case 0:
- + if (strcmp(str2,"B16") != 0) return False;
- + struct_len = 16;
- + break;
- + case 1:
- + if (strcmp(str2,"B16BBDz") != 0) return False;
- + struct_len = 26;
- + break;
- + case 2:
- + if (strcmp(str2,"B16BBDzDDDWWzWWWWWWWBB21zWWWWWWWWWWWWWWWWWWWWWWz")
- + != 0) return False;
- + struct_len = 134;
- + break;
- + case 3:
- + if (strcmp(str2,"B16BBDzDDDWWzWWWWWWWBB21zWWWWWWWWWWWWWWWWWWWWWWzDWz")
- + != 0) return False;
- + struct_len = 144;
- + break;
- + case 20:
- + if (strcmp(str2,"DN") != 0) return False;
- + struct_len = 6;
- + break;
- + case 50:
- + if (strcmp(str2,"B16BBDzWWzzz") != 0) return False;
- + struct_len = 42;
- + break;
- + default: return False;
- + }
-
- *rdata_len = mdrcnt;
- *rdata = REALLOC(*rdata,*rdata_len);
-
- - SSVAL(*rparam,0,NERR_Success);
- - SSVAL(*rparam,2,0); /* converter word */
- -
- p = *rdata;
- - p2 = p + 42;
- -
- - StrnCpy(p,local_machine,16);
- + p2 = p + struct_len;
- + if (uLevel != 20) StrnCpy(p,local_machine,16);
- p += 16;
- - p += 2;
- - SIVAL(p,0,0xB03); /* unix server */
- - p += 4;
- + if (uLevel > 0)
- + {
- + pstring comment;
- + SCVAL(p,0,1); /* version_major */
- + SCVAL(p,1,9); /* version_minor */
- + SIVAL(p,2,SV_TYPE_WORKSTATION|SV_TYPE_SERVER|SV_TYPE_TIME_SOURCE
- + /*|SV_TYPE_DOMAIN_CTRL*/); /* type */
- + SIVAL(p,6,PTR_DIFF(p2,*rdata));
- + strcpy(comment,lp_serverstring());
- + standard_sub(cnum,comment);
- + StrnCpy(p2,comment,MAX(mdrcnt - struct_len,0));
- + p2 = skip_string(p2,1);
- + }
- + if (uLevel > 1)
- + {
- + return False; /* not yet implemented */
- + }
-
- - SIVAL(p,0,PTR_DIFF(p2,*rdata)); p+=4;
- - strcpy(p2,comment);
- - p2 = skip_string(p2,1);
- -
- - if (strcsequal(str2,"B16BBDzWWzzz")) {
- - p += 4;
- -
- - SIVAL(p,0,PTR_DIFF(p2,*rdata)); p+=4;
- - strcpy(p2,"str 1");
- - p2 = skip_string(p2,1);
- -
- - SIVAL(p,0,PTR_DIFF(p2,*rdata)); p+=4;
- - strcpy(p2,"str 2");
- - p2 = skip_string(p2,1);
- -
- - SIVAL(p,0,PTR_DIFF(p2,*rdata)); p+=4;
- - strcpy(p2,"str 3");
- - p2 = skip_string(p2,1);
- - }
- -
- *rdata_len = PTR_DIFF(p2,*rdata);
-
- - SSVAL(*rparam,4,*rdata_len); /* is this right? */
- + *rparam_len = 6;
- + *rparam = REALLOC(*rparam,*rparam_len);
- + SSVAL(*rparam,0,NERR_Success);
- + SSVAL(*rparam,2,0); /* converter word */
- + SSVAL(*rparam,4,*rdata_len);
-
- return(True);
- }
-
-
- /****************************************************************************
- -get info about the server
- -****************************************************************************/
- + get info about the server
- + ****************************************************************************/
- static BOOL api_NetWkstaGetInfo(int cnum,char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- @@ -686,7 +1219,7 @@
- *rdata = REALLOC(*rdata,*rdata_len);
-
- SSVAL(*rparam,0,NERR_Success);
- - SSVAL(*rparam,2,0); /* converter word */
- + SSVAL(*rparam,2,0); /* converter word */
-
- p = *rdata;
- p2 = p + 22;
- @@ -711,7 +1244,7 @@
- p += 2;
-
- SIVAL(p,0,PTR_DIFF(p2,*rdata));
- - strcpy(p2,lp_workgroup()); /* login domain */
- + strcpy(p2,lp_workgroup()); /* login domain */
- p2 = skip_string(p2,1);
- p += 4;
-
- @@ -728,10 +1261,649 @@
- }
-
-
- +/****************************************************************************
- + get info about a user
- + ****************************************************************************/
- +
- +#define USER_PRIV_GUEST 0
- +#define USER_PRIV_USER 1
- +#define USER_PRIV_ADMIN 2
- +
- +static BOOL api_RNetUserGetInfo(int cnum,char *param,char *data,
- + int mdrcnt,int mprcnt,
- + char **rdata,char **rparam,
- + int *rdata_len,int *rparam_len)
- +{
- + char *str1 = param+2;
- + char *str2 = skip_string(str1,1);
- + char *UserName = skip_string(str2,1);
- + char *p = skip_string(UserName,1);
- + int uLevel = SVAL(p,0);
- + char *p2;
- +
- + *rparam_len = 6;
- + *rparam = REALLOC(*rparam,*rparam_len);
- +
- + /* check it's a supported varient */
- + if (strcmp(str1,"zWrLh") != 0) return False;
- + switch( uLevel ) {
- + case 0: p2 = "B21"; break;
- + case 1: p2 = "B21BB16DWzzWz"; break;
- + case 2: p2 = "B21BB16DWzzWzDzzzzDDDDWb21WWzWW"; break;
- + case 10: p2 = "B21Bzzz"; break;
- + case 11: p2 = "B21BzzzWDDzzDDWWzWzDWb21W"; break;
- + default: return False;
- + }
- + if (strcmp(p2,str2) != 0) return False;
- +
- + *rdata_len = mdrcnt + 1024;
- + *rdata = REALLOC(*rdata,*rdata_len);
- +
- + SSVAL(*rparam,0,NERR_Success);
- + SSVAL(*rparam,2,0); /* converter word */
- +
- + p = *rdata;
- + p2 = p + 86;
- +
- + memset(p,0,21);
- + strcpy(p,UserName);
- + if (uLevel > 0) {
- + SCVAL(p,21,0);
- + *p2 = 0;
- + if (uLevel >= 10) {
- + SIVAL(p,22,PTR_DIFF(p2,*rdata)); /* comment */
- + SIVAL(p,26,PTR_DIFF(p2,*rdata)); /* user_comment */
- + SIVAL(p,30,PTR_DIFF(p2,*rdata)); /* full name */
- + p2++;
- + }
- + if (uLevel == 11) {
- + SSVAL(p,34,USER_PRIV_ADMIN); /* user privilege */
- + SIVAL(p,36,0); /* auth flags */
- + SIVAL(p,40,0); /* password age */
- + SIVAL(p,44,PTR_DIFF(p2,*rdata)); /* home dir */
- + strcpy(p2,"Y:\\GIGA\\C$\\PRJ\\USERS\\AD");
- + p2 = skip_string(p2,1);
- + SIVAL(p,48,PTR_DIFF(p2,*rdata)); /* parms */
- + strcpy(p2,"");
- + p2 = skip_string(p2,1);
- + SIVAL(p,52,0); /* last logon */
- + SIVAL(p,56,0); /* last logoff */
- + SSVAL(p,60,-1); /* bad pw counts */
- + SSVAL(p,62,-1); /* num logons */
- + SIVAL(p,64,PTR_DIFF(p2,*rdata)); /* logon server */
- + strcpy(p2,"\\\\GIGA");
- + p2 = skip_string(p2,1);
- + SSVAL(p,68,49); /* country code */
- + SIVAL(p,70,0); /* workstations */
- +
- + SIVAL(p,74,-1L); /* max storage */
- + SSVAL(p,78,168); /* units per week */
- + SIVAL(p,80,PTR_DIFF(p2,*rdata)); /* logon hours */
- + memset(p2,-1,21);
- + p2 += 21;
- + SSVAL(p,84,860); /* code page */
- + }
- + if (uLevel == 1 || uLevel == 2) {
- + memset(p+22,' ',16); /* password */
- + SIVAL(p,38,-1); /* password age */
- + SSVAL(p,42,USER_PRIV_ADMIN); /* user privilege */
- + SIVAL(p,44,PTR_DIFF(p2,*rdata)); /* home dir */
- + strcpy(p2,"Y:\\GIGA\\C$\\PRJ\\USERS\\AD");
- + p2 = skip_string(p2,1);
- + SIVAL(p,48,PTR_DIFF(p2,*rdata)); /* comment */
- + *p2++ = 0;
- + SSVAL(p,52,0); /* flags */
- + SIVAL(p,54,0); /* script_path */
- + if (uLevel == 2) {
- + SIVAL(p,60,0); /* auth_flags */
- + SIVAL(p,64,PTR_DIFF(p2,*rdata)); /* full_name */
- + strcpy(p2,"<Full Name>");
- + p2 = skip_string(p2,1);
- + SIVAL(p,68,0); /* urs_comment */
- + SIVAL(p,72,PTR_DIFF(p2,*rdata)); /* parms */
- + strcpy(p2,"");
- + p2 = skip_string(p2,1);
- + SIVAL(p,76,0); /* workstations */
- + SIVAL(p,80,0); /* last_logon */
- + SIVAL(p,84,0); /* last_logoff */
- + SIVAL(p,88,-1); /* acct_expires */
- + SIVAL(p,92,-1); /* max_storage */
- + SSVAL(p,96,168); /* units_per_week */
- + SIVAL(p,98,PTR_DIFF(p2,*rdata)); /* logon_hours */
- + memset(p2,-1,21);
- + p2 += 21;
- + SSVAL(p,102,-1); /* bad_pw_count */
- + SSVAL(p,104,-1); /* num_logons */
- + SIVAL(p,106,PTR_DIFF(p2,*rdata)); /* logon_server */
- + strcpy(p2,"\\\\GIGA");
- + p2 = skip_string(p2,1);
- + SSVAL(p,110,49); /* country_code */
- + SSVAL(p,112,860); /* code page */
- + }
- + }
- + }
- +
- + *rdata_len = PTR_DIFF(p2,*rdata);
- +
- + SSVAL(*rparam,4,*rdata_len); /* is this right?? */
- +
- + return(True);
- +}
- +
- +static BOOL api_WWkstaUserLogon(int cnum,char *param,char *data,
- + int mdrcnt,int mprcnt,
- + char **rdata,char **rparam,
- + int *rdata_len,int *rparam_len)
- +{
- + char *str1 = param+2;
- + char *str2 = skip_string(str1,1);
- + char *p = skip_string(str2,1);
- + int uLevel,cbBuf;
- + struct pack_desc desc;
- + char* name;
- +
- + uLevel = SVAL(p,0);
- + cbBuf = SVAL(p,2);
- + name = p + 4;
- +
- + DEBUG(3,("WWkstaUserLogon uLevel=%d name=%s\n",uLevel,name));
- +
- + /* check it's a supported varient */
- + if (strcmp(str1,"OOWb54WrLh") != 0) return False;
- + if (uLevel != 1 || strcmp(str2,"WB21BWDWWDDDDDDDzzzD") != 0) return False;
- + if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- + desc.base = *rdata;
- + desc.buflen = mdrcnt;
- + desc.subformat = NULL;
- + desc.format = str2;
- + init_package(&desc,1,0);
- + PACK(&desc,"W",0); /* code */
- + PACK(&desc,"B21",name); /* eff. name */
- + PACK(&desc,"B",0); /* pad */
- + PACK(&desc,"W",2); /* priv */
- + PACK(&desc,"D",0); /* auth flags */
- + PACK(&desc,"W",0); /* num logons */
- + PACK(&desc,"W",0); /* bad pw count */
- + PACK(&desc,"D",0); /* last logon */
- + PACK(&desc,"D",0); /* last logoff */
- + PACK(&desc,"D",-1); /* logoff time */
- + PACK(&desc,"D",-1); /* kickoff time */
- + PACK(&desc,"D",0); /* password age */
- + PACK(&desc,"D",0); /* password can change */
- + PACK(&desc,"D",-1); /* password must change */
- + PACK(&desc,"z",local_machine);/* computer */
- + PACK(&desc,"z",lp_workgroup());/* domain */
- + PACK(&desc,"z",0); /* script path */
- + PACK(&desc,"D",0); /* reserved */
- + *rdata_len = desc.usedlen;
- +
- + *rparam_len = 6;
- + *rparam = REALLOC(*rparam,*rparam_len);
- + SSVALS(*rparam,0,desc.errcode);
- + SSVAL(*rparam,2,0);
- + SSVAL(*rparam,4,desc.neededlen);
- +
- + DEBUG(4,("WWkstaUserLogon: errorcode %d\n",desc.errcode));
- + return(True);
- +}
- +
- +
- +/****************************************************************************
- + api_WAccessGetUserPerms
- + ****************************************************************************/
- +static BOOL api_WAccessGetUserPerms(int cnum,char *param,char *data,
- + int mdrcnt,int mprcnt,
- + char **rdata,char **rparam,
- + int *rdata_len,int *rparam_len)
- +{
- + char *str1 = param+2;
- + char *str2 = skip_string(str1,1);
- + char *user = skip_string(str2,1);
- + char *resource = skip_string(user,1);
- +
- + DEBUG(3,("WAccessGetUserPerms user=%s resource=%s\n",user,resource));
- +
- + /* check it's a supported varient */
- + if (strcmp(str1,"zzh") != 0) return False;
- + if (strcmp(str2,"") != 0) return False;
- +
- + *rparam_len = 6;
- + *rparam = REALLOC(*rparam,*rparam_len);
- + SSVALS(*rparam,0,0); /* errorcode */
- + SSVAL(*rparam,2,0); /* converter word */
- + SSVAL(*rparam,4,0x7f); /* permission flags */
- +
- + return(True);
- +}
- +
- +/****************************************************************************
- + api_WPrintJobEnumerate
- + ****************************************************************************/
- +
- +static int check_printjob_info(struct pack_desc* desc,
- + int uLevel, const char* id)
- +{
- + desc->subformat = NULL;
- + switch( uLevel ) {
- + case 0: desc->format = "W"; break;
- + case 1: desc->format = "WB21BB16B10zWWzDDz"; break;
- + case 2: desc->format = "WWzWWDDzz"; break;
- + case 3: desc->format = "WWzWWDDzzzzzzzzzzlz"; break;
- + default: return False;
- + }
- + if (strcmp(desc->format,id) != 0) return False;
- + return True;
- +}
- +
- +static BOOL api_WPrintJobGetInfo(int cnum,char *param,char *data,
- + int mdrcnt,int mprcnt,
- + char **rdata,char **rparam,
- + int *rdata_len,int *rparam_len)
- +{
- + char *str1 = param+2;
- + char *str2 = skip_string(str1,1);
- + char *p = skip_string(str2,1);
- + int uJobId = SVAL(p,0);
- + int uLevel,cbBuf;
- + int count;
- + int i;
- + int snum;
- + int job;
- + struct pack_desc desc;
- + print_queue_struct *queue=NULL;
- + print_status_struct status;
- +
- + uLevel = SVAL(p,2);
- + cbBuf = SVAL(p,4);
- +
- + DEBUG(3,("WPrintJobGetInfo uLevel=%d uJobId=0x%X\n",uLevel,uJobId));
- +
- + /* check it's a supported varient */
- + if (strcmp(str1,"WWrLh") != 0) return False;
- + if (!check_printjob_info(&desc,uLevel,str2)) return False;
- +
- + snum = (unsigned int)uJobId >> 8; /*## valid serice number??*/
- + job = uJobId & 0xFF;
- +
- + count = get_printqueue(snum,cnum,&queue,&status);
- + for (i = 0; i < count; i++) {
- + if ((queue[i].job % 0xFF) == job) break;
- + }
- + if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- + desc.base = *rdata;
- + desc.buflen = mdrcnt;
- + init_package(&desc,1,0);
- + if (i < count) {
- + fill_printjob_info(cnum,snum,uLevel,&desc,&queue[i],i);
- + *rdata_len = desc.usedlen;
- + }
- + else {
- + desc.errcode = NERR_JobNotFound;
- + *rdata_len = 0;
- + }
- +
- + *rparam_len = 6;
- + *rparam = REALLOC(*rparam,*rparam_len);
- + SSVALS(*rparam,0,desc.errcode);
- + SSVAL(*rparam,2,0);
- + SSVAL(*rparam,4,desc.neededlen);
- +
- + if (queue) free(queue);
- +
- + DEBUG(4,("WPrintJobGetInfo: errorcode %d\n",desc.errcode));
- + return(True);
- +}
- +
- +static BOOL api_WPrintJobEnumerate(int cnum,char *param,char *data,
- + int mdrcnt,int mprcnt,
- + char **rdata,char **rparam,
- + int *rdata_len,int *rparam_len)
- +{
- + char *str1 = param+2;
- + char *str2 = skip_string(str1,1);
- + char *p = skip_string(str2,1);
- + char* name = p;
- + int uLevel,cbBuf;
- + int count;
- + int i, succnt;
- + int snum;
- + struct pack_desc desc;
- + print_queue_struct *queue=NULL;
- + print_status_struct status;
- +
- + p = skip_string(p,1);
- + uLevel = SVAL(p,0);
- + cbBuf = SVAL(p,2);
- +
- + DEBUG(3,("WPrintJobEnumerate uLevel=%d name=%s\n",uLevel,name));
- +
- + /* check it's a supported varient */
- + if (strcmp(str1,"zWrLeh") != 0) return False;
- + if (uLevel > 2) return False; /* defined only for uLevel 0,1,2 */
- + if (!check_printjob_info(&desc,uLevel,str2)) return False;
- +
- + snum = lp_servicenumber(name);
- + if (snum < 0 && pcap_printername_ok(name,NULL)) {
- + int pnum = lp_servicenumber(PRINTERS_NAME);
- + if (pnum >= 0) {
- + lp_add_printer(name,pnum);
- + snum = lp_servicenumber(name);
- + }
- + }
- +
- + count = get_printqueue(snum,cnum,&queue,&status);
- + if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- + desc.base = *rdata;
- + desc.buflen = mdrcnt;
- + init_package(&desc,count,0);
- +
- + succnt = 0;
- + for (i = 0; i < count; i++) {
- + fill_printjob_info(cnum,snum,uLevel,&desc,&queue[i],i);
- + if (desc.errcode == NERR_Success) succnt = i+1;
- + }
- + *rdata_len = desc.usedlen;
- +
- + *rparam_len = 8;
- + *rparam = REALLOC(*rparam,*rparam_len);
- + SSVALS(*rparam,0,desc.errcode);
- + SSVAL(*rparam,2,0);
- + SSVAL(*rparam,4,succnt);
- + SSVAL(*rparam,6,count);
- +
- + if (queue) free(queue);
- +
- + DEBUG(4,("WPrintJobEnumerate: errorcode %d\n",desc.errcode));
- + return(True);
- +}
- +
- +static int check_printdest_info(struct pack_desc* desc,
- + int uLevel, const char* id)
- +{
- + desc->subformat = NULL;
- + switch( uLevel ) {
- + case 0: desc->format = "B9"; break;
- + case 1: desc->format = "B9B21WWzW"; break;
- + case 2: desc->format = "z"; break;
- + case 3: desc->format = "zzzWWzzzWW"; break;
- + default: return False;
- + }
- + if (strcmp(desc->format,id) != 0) return False;
- + return True;
- +}
- +
- +static void fill_printdest_info(int cnum, int snum, int uLevel,
- + struct pack_desc* desc)
- +{
- + char buf[100];
- + strcpy(buf,SERVICE(snum));
- + strupper(buf);
- + if (uLevel <= 1) {
- + PACK(desc,"B9",buf); /* szName */
- + if (uLevel == 1) {
- + PACK(desc,"B21",""); /* szUserName */
- + PACK(desc,"W",0); /* uJobId */
- + PACK(desc,"W",0); /* fsStatus */
- + PACK(desc,"z",""); /* pszStatus */
- + PACK(desc,"W",0); /* time */
- + }
- + }
- + if (uLevel == 2 || uLevel == 3) {
- + PACK(desc,"z",buf); /* pszPrinterName */
- + if (uLevel == 3) {
- + PACK(desc,"z",""); /* pszUserName */
- + PACK(desc,"z",0); /* pszLogAddr */
- + PACK(desc,"W",0); /* uJobId */
- + PACK(desc,"W",0); /* fsStatus */
- + PACK(desc,"z",""); /* pszStatus */
- + PACK(desc,"z",""); /* pszComment */
- + PACK(desc,"z","IBMNULL"); /* pszDrivers */
- + PACK(desc,"W",0); /* time */
- + PACK(desc,"W",0); /* pad1 */
- + }
- + }
- +}
- +
- +static BOOL api_WPrintDestGetInfo(int cnum,char *param,char *data,
- + int mdrcnt,int mprcnt,
- + char **rdata,char **rparam,
- + int *rdata_len,int *rparam_len)
- +{
- + char *str1 = param+2;
- + char *str2 = skip_string(str1,1);
- + char *p = skip_string(str2,1);
- + char* PrinterName = p;
- + int uLevel,cbBuf;
- + struct pack_desc desc;
- + int snum;
- +
- + p = skip_string(p,1);
- + uLevel = SVAL(p,0);
- + cbBuf = SVAL(p,2);
- +
- + DEBUG(3,("WPrintDestGetInfo uLevel=%d PrinterName=%s\n",uLevel,PrinterName));
- +
- + /* check it's a supported varient */
- + if (strcmp(str1,"zWrLh") != 0) return False;
- + if (!check_printdest_info(&desc,uLevel,str2)) return False;
- +
- + snum = lp_servicenumber(PrinterName);
- + if (snum < 0 && pcap_printername_ok(PrinterName,NULL)) {
- + int pnum = lp_servicenumber(PRINTERS_NAME);
- + if (pnum >= 0) {
- + lp_add_printer(PrinterName,pnum);
- + snum = lp_servicenumber(PrinterName);
- + }
- + }
- +
- + if (snum < 0) {
- + *rdata_len = 0;
- + desc.errcode = NERR_DestNotFound;
- + desc.neededlen = 0;
- + }
- + else {
- + if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- + desc.base = *rdata;
- + desc.buflen = mdrcnt;
- + init_package(&desc,1,0);
- + fill_printdest_info(cnum,snum,uLevel,&desc);
- + *rdata_len = desc.usedlen;
- + }
- +
- + *rparam_len = 6;
- + *rparam = REALLOC(*rparam,*rparam_len);
- + SSVALS(*rparam,0,desc.errcode);
- + SSVAL(*rparam,2,0);
- + SSVAL(*rparam,4,desc.neededlen);
- +
- + DEBUG(4,("WPrintDestGetInfo: errorcode %d\n",desc.errcode));
- + return(True);
- +}
- +
- +static BOOL api_WPrintDestEnum(int cnum,char *param,char *data,
- + int mdrcnt,int mprcnt,
- + char **rdata,char **rparam,
- + int *rdata_len,int *rparam_len)
- +{
- + char *str1 = param+2;
- + char *str2 = skip_string(str1,1);
- + char *p = skip_string(str2,1);
- + int uLevel,cbBuf;
- + int queuecnt;
- + int i, n, succnt;
- + struct pack_desc desc;
- + int services = lp_numservices();
- +
- + uLevel = SVAL(p,0);
- + cbBuf = SVAL(p,2);
- +
- + DEBUG(3,("WPrintDestEnum uLevel=%d\n",uLevel));
- +
- + /* check it's a supported varient */
- + if (strcmp(str1,"WrLeh") != 0) return False;
- + if (!check_printdest_info(&desc,uLevel,str2)) return False;
- +
- + queuecnt = 0;
- + for (i = 0; i < services; i++)
- + if (lp_print_ok(i) && lp_browseable(i))
- + queuecnt++;
- +
- + if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- + desc.base = *rdata;
- + desc.buflen = mdrcnt;
- + init_package(&desc,queuecnt,0);
- +
- + succnt = 0;
- + n = 0;
- + for (i = 0; i < services; i++) {
- + if (lp_print_ok(i) && lp_browseable(i)) {
- + fill_printdest_info(cnum,i,uLevel,&desc);
- + n++;
- + if (desc.errcode == NERR_Success) succnt = n;
- + }
- + }
- + *rdata_len = desc.usedlen;
- +
- + *rparam_len = 8;
- + *rparam = REALLOC(*rparam,*rparam_len);
- + SSVALS(*rparam,0,desc.errcode);
- + SSVAL(*rparam,2,0);
- + SSVAL(*rparam,4,succnt);
- + SSVAL(*rparam,6,queuecnt);
- +
- + DEBUG(4,("WPrintDestEnumerate: errorcode %d\n",desc.errcode));
- + return(True);
- +}
- +
- +static BOOL api_WPrintDriverEnum(int cnum,char *param,char *data,
- + int mdrcnt,int mprcnt,
- + char **rdata,char **rparam,
- + int *rdata_len,int *rparam_len)
- +{
- + char *str1 = param+2;
- + char *str2 = skip_string(str1,1);
- + char *p = skip_string(str2,1);
- + int uLevel,cbBuf;
- + int succnt;
- + struct pack_desc desc;
- +
- + uLevel = SVAL(p,0);
- + cbBuf = SVAL(p,2);
- +
- + DEBUG(3,("WPrintDriverEnum uLevel=%d\n",uLevel));
- +
- + /* check it's a supported varient */
- + if (strcmp(str1,"WrLeh") != 0) return False;
- + if (uLevel != 0 || strcmp(str2,"B41") != 0) return False;
- +
- + if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- + desc.base = *rdata;
- + desc.buflen = mdrcnt;
- + init_package(&desc,1,0);
- +
- + PACK(&desc,"B41","IBMNULL");
- + succnt = (desc.errcode == NERR_Success ? 1 : 0);
- +
- + *rdata_len = desc.usedlen;
- +
- + *rparam_len = 8;
- + *rparam = REALLOC(*rparam,*rparam_len);
- + SSVALS(*rparam,0,desc.errcode);
- + SSVAL(*rparam,2,0);
- + SSVAL(*rparam,4,succnt);
- + SSVAL(*rparam,6,1);
- +
- + DEBUG(4,("WPrintDriverEnum: errorcode %d\n",desc.errcode));
- + return(True);
- +}
- +
- +static BOOL api_WPrintQProcEnum(int cnum,char *param,char *data,
- + int mdrcnt,int mprcnt,
- + char **rdata,char **rparam,
- + int *rdata_len,int *rparam_len)
- +{
- + char *str1 = param+2;
- + char *str2 = skip_string(str1,1);
- + char *p = skip_string(str2,1);
- + int uLevel,cbBuf;
- + int succnt;
- + struct pack_desc desc;
- +
- + uLevel = SVAL(p,0);
- + cbBuf = SVAL(p,2);
- +
- + DEBUG(3,("WPrintQProcEnum uLevel=%d\n",uLevel));
- +
- + /* check it's a supported varient */
- + if (strcmp(str1,"WrLeh") != 0) return False;
- + if (uLevel != 0 || strcmp(str2,"B13") != 0) return False;
- +
- + if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- + desc.base = *rdata;
- + desc.buflen = mdrcnt;
- + init_package(&desc,1,0);
- +
- + PACK(&desc,"B13","lpd");
- + succnt = (desc.errcode == NERR_Success ? 1 : 0);
- +
- + *rdata_len = desc.usedlen;
- +
- + *rparam_len = 8;
- + *rparam = REALLOC(*rparam,*rparam_len);
- + SSVALS(*rparam,0,desc.errcode);
- + SSVAL(*rparam,2,0);
- + SSVAL(*rparam,4,succnt);
- + SSVAL(*rparam,6,1);
- +
- + DEBUG(4,("WPrintQProcEnum: errorcode %d\n",desc.errcode));
- + return(True);
- +}
- +
- +static BOOL api_WPrintPortEnum(int cnum,char *param,char *data,
- + int mdrcnt,int mprcnt,
- + char **rdata,char **rparam,
- + int *rdata_len,int *rparam_len)
- +{
- + char *str1 = param+2;
- + char *str2 = skip_string(str1,1);
- + char *p = skip_string(str2,1);
- + int uLevel,cbBuf;
- + int succnt;
- + struct pack_desc desc;
-
- + uLevel = SVAL(p,0);
- + cbBuf = SVAL(p,2);
- +
- + DEBUG(3,("WPrintPortEnum uLevel=%d\n",uLevel));
- +
- + /* check it's a supported varient */
- + if (strcmp(str1,"WrLeh") != 0) return False;
- + if (uLevel != 0 || strcmp(str2,"B9") != 0) return False;
- +
- + if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- + desc.base = *rdata;
- + desc.buflen = mdrcnt;
- + init_package(&desc,1,0);
- +
- + PACK(&desc,"B13","lp0");
- + succnt = (desc.errcode == NERR_Success ? 1 : 0);
- +
- + *rdata_len = desc.usedlen;
- +
- + *rparam_len = 8;
- + *rparam = REALLOC(*rparam,*rparam_len);
- + SSVALS(*rparam,0,desc.errcode);
- + SSVAL(*rparam,2,0);
- + SSVAL(*rparam,4,succnt);
- + SSVAL(*rparam,6,1);
- +
- + DEBUG(4,("WPrintPortEnum: errorcode %d\n",desc.errcode));
- + return(True);
- +}
- +
- /****************************************************************************
- -the buffer was too small
- -****************************************************************************/
- + the buffer was too small
- + ****************************************************************************/
- static BOOL api_TooSmall(int cnum,char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- @@ -751,8 +1923,8 @@
-
-
- /****************************************************************************
- -the request is not supported
- -****************************************************************************/
- + the request is not supported
- + ****************************************************************************/
- static BOOL api_Unsupported(int cnum,char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- @@ -764,7 +1936,7 @@
- *rdata_len = 0;
-
- SSVAL(*rparam,0,NERR_notsupported);
- - SSVAL(*rparam,2,0); /* converter word */
- + SSVAL(*rparam,2,0); /* converter word */
-
- DEBUG(3,("Unsupported API command\n"));
-
- @@ -781,20 +1953,33 @@
- BOOL (*fn)();
- int flags;
- } api_commands[] = {
- - {"DosPrintQGetInfo",70,api_DosPrintQGetInfo,0},
- - {"NetRemoteTOD",91,api_NetRemoteTOD,0},
- - {"SetUserPassword",115,api_SetUserPassword,0},
- - {"RNetShareEnum",0,api_RNetShareEnum,0},
- - {"RDosPrintJobDel",81,api_RDosPrintJobDel,0},
- - {"PrintJobInfo",147,api_PrintJobInfo,0},
- - {"RNetServerGetInfo",13,api_RNetServerGetInfo,0},
- - {"NetWkstaGetInfo",63,api_NetWkstaGetInfo,0},
- - {NULL,-1,api_Unsupported,0}};
- + {"RNetShareEnum", 0, api_RNetShareEnum,0},
- + {"RNetShareGetInfo", 1, api_RNetShareGetInfo,0},
- + {"RNetServerGetInfo", 13, api_RNetServerGetInfo,0},
- + {"RNetUserGetInfo", 56, api_RNetUserGetInfo,0},
- + {"NetWkstaGetInfo", 63, api_NetWkstaGetInfo,0},
- + {"DosPrintQEnum", 69, api_DosPrintQEnum,0},
- + {"DosPrintQGetInfo", 70, api_DosPrintQGetInfo,0},
- + {"WPrintJobEnumerate",76, api_WPrintJobEnumerate,0},
- + {"WPrintJobGetInfo", 77, api_WPrintJobGetInfo,0},
- + {"RDosPrintJobDel", 81, api_RDosPrintJobDel,0},
- + {"WPrintDestEnum", 84, api_WPrintDestEnum,0},
- + {"WPrintDestGetInfo", 85, api_WPrintDestGetInfo,0},
- + {"NetRemoteTOD", 91, api_NetRemoteTOD,0},
- + {"WPrintQueuePurge", 103, api_WPrintQueuePurge,0},
- + {"WAccessGetUserPerms",105, api_WAccessGetUserPerms,0},
- + {"SetUserPassword", 115, api_SetUserPassword,0},
- + {"WWkstaUserLogon", 132, api_WWkstaUserLogon,0},
- + {"PrintJobInfo", 147, api_PrintJobInfo,0},
- + {"WPrintDriverEnum", 205, api_WPrintDriverEnum,0},
- + {"WPrintQProcEnum", 206, api_WPrintQProcEnum,0},
- + {"WPrintPortEnum", 207, api_WPrintPortEnum,0},
- + {NULL, -1, api_Unsupported,0}};
-
-
- /****************************************************************************
- -handle remote api calls
- -****************************************************************************/
- + handle remote api calls
- + ****************************************************************************/
- static int api_reply(int cnum,char *outbuf,char *data,char *params,
- int tdscnt,int tpscnt,int mdrcnt,int mprcnt)
- {
- @@ -828,7 +2013,7 @@
- rparam_len > mprcnt)
- {
- reply = api_TooSmall(cnum,params,data,mdrcnt,mprcnt,
- - &rdata,&rparam,&rdata_len,&rparam_len);
- + &rdata,&rparam,&rdata_len,&rparam_len);
- }
-
-
- @@ -851,8 +2036,8 @@
- }
-
- /****************************************************************************
- -handle named pipe commands
- -****************************************************************************/
- + handle named pipe commands
- + ****************************************************************************/
- static int named_pipe(int cnum,char *outbuf,char *name,
- uint16 *setup,char *data,char *params,
- int suwcnt,int tdscnt,int tpscnt,
- @@ -871,7 +2056,7 @@
-
- /****************************************************************************
- reply to a SMBtrans
- -****************************************************************************/
- + ****************************************************************************/
- int reply_trans(char *inbuf,char *outbuf)
- {
- fstring name;
- @@ -937,7 +2122,7 @@
- /* Ensure this is still a trans packet (sanity check) */
- if(CVAL(inbuf, smb_com) != SMBtrans)
- {
- - DEBUG(0,("Invalid secondary trans2 packet\n"));
- + DEBUG(2,("Invalid secondary trans2 packet\n"));
- if (params) free(params);
- if (data) free(data);
- if (setup) free(setup);
- diff -u -r --new-file last-version/source/nameserv.c samba-1.9.14alpha4/source/nameserv.c
- --- last-version/source/nameserv.c Sat Jul 1 01:10:56 1995
- +++ samba-1.9.14alpha4/source/nameserv.c Sun Jul 2 02:08:39 1995
- @@ -908,7 +908,83 @@
- return;
- }
-
- +/****************************************************************************
- +reply to a name release
- +****************************************************************************/
- +static void reply_name_release(char *inbuf)
- +{
- + pstring outbuf;
- + int rec_name_trn_id = RSVAL(inbuf,0);
- + char qname[100]="";
- + char *p = inbuf;
- + struct in_addr ip;
- + int n=0;
- + int name_type;
- + unsigned char nb_flags;
- + struct in_addr tmpip;
- + BOOL release_ok=False;
- + int reason=5;
- +
- +
- + bzero(outbuf,sizeof(outbuf));
- +
- + name_type = name_extract(inbuf,12,qname);
- +
- + p += 12;
- + p += name_len(p);
- + p += 4;
- + p += name_len(p);
- + p += 4;
- + nb_flags = CVAL(p,6);
- + p += 8;
- + putip((char *)&ip,p);
- +
- + DEBUG(2,("Name release request for %s (%s) nb_flags=0x%x ntype=%d\n",
- + qname,inet_ntoa(ip),nb_flags,name_type));
- +
- +
- + n = find_name(qname,name_type,True);
- + if (n>=0 &&
- + !names[n].isgroup &&
- + memcmp(&names[n].ip,&ip,sizeof(ip))==0 &&
- + names[n].ttl != 0) {
- + release_ok = True;
- + names[n].valid = False;
- + }
- +
- +
- + /* Send a POSITIVE NAME RELEASE RESPONSE */
- + RSSVAL(outbuf,0,rec_name_trn_id);
- + CVAL(outbuf,2) = (1<<7) | (6<<3) | 4;
- + CVAL(outbuf,3) = release_ok?0:reason;
- + RSSVAL(outbuf,4,0);
- + RSSVAL(outbuf,6,1);
- + RSSVAL(outbuf,8,0);
- + RSSVAL(outbuf,10,0);
- + p = outbuf+12;
- + strcpy(p,inbuf+12);
- + p += name_len(p);
- + RSSVAL(p,0,0x20);
- + RSSVAL(p,2,0x1);
- + RSIVAL(p,4,0); /* ttl */
- + RSSVAL(p,8,6);
- + RSSVAL(p,10,nb_flags);
- + p += 12;
- + putip(p,&ip);
- + p += 4;
- +
- + DEBUG(2,("Sending a %s name release response\n",release_ok?"positive":"negative"));
- + if (DEBUGLEVEL > 2)
- + show_nmb(outbuf);
-
- + tmpip = lastip;
- + num_good_sends++;
- + send_nmb(outbuf,PTR_DIFF(p,outbuf),&tmpip,lastport>0?lastport:137);
- +
- + return;
- +}
- +
- +
- /****************************************************************************
- reply to a name status query
- ****************************************************************************/
- @@ -1163,6 +1239,12 @@
- if (opcode == 0 && qdcount==1)
- {
- reply_name_query(inbuf);
- + return;
- + }
- +
- + if (!bcast && opcode == 6 && qdcount==1 && arcount==1)
- + {
- + reply_name_release(inbuf);
- return;
- }
-
- diff -u -r --new-file last-version/source/printing.c samba-1.9.14alpha4/source/printing.c
- --- last-version/source/printing.c Fri Jun 30 17:32:52 1995
- +++ samba-1.9.14alpha4/source/printing.c Sat Jul 1 14:26:15 1995
- @@ -25,9 +25,9 @@
- extern connection_struct Connections[];
- extern files_struct Files[];
-
- +BOOL lpq_cache_reset = False;
-
-
- -
- /****************************************************************************
- Build the print command in the supplied buffer. This means getting the
- print command for the service and inserting the printer name and the
- @@ -101,6 +101,8 @@
- int cnum = Files[fnum].cnum;
- char *tempstr;
-
- + lpq_cache_reset = True;
- +
- *syscmd = 0;
-
- if (Files[fnum].pos == -1) {
- @@ -443,7 +445,7 @@
-
-
- char *stat0_strings[] = { "enabled", "online", "idle", NULL };
- -char *stat1_strings[] = { "offline", "disabled", "down", NULL };
- +char *stat1_strings[] = { "offline", "disabled", "down", "off", NULL };
- char *stat2_strings[] = { "jam", "paper", "error", "responding", "not accepting", "not running", NULL };
-
- /****************************************************************************
- @@ -479,22 +481,19 @@
-
- for (i=0; stat0_strings[i]; i++)
- if (strstr(line,stat0_strings[i])) {
- - if (status->message) free(status->message);
- - status->message = strdup(line);
- + StrnCpy(status->message,line,sizeof(status->message)-1);
- status->status=LPSTAT_OK;
- return(ret);
- }
- for (i=0; stat1_strings[i]; i++)
- if (strstr(line,stat1_strings[i])) {
- - if (status->message) free(status->message);
- - status->message = strdup(line);
- + StrnCpy(status->message,line,sizeof(status->message)-1);
- status->status=LPSTAT_STOPPED;
- return(ret);
- }
- for (i=0; stat2_strings[i]; i++)
- if (strstr(line,stat2_strings[i])) {
- - if (status->message) free(status->message);
- - status->message = strdup(line);
- + StrnCpy(status->message,line,sizeof(status->message)-1);
- status->status=LPSTAT_ERROR;
- return(ret);
- }
- @@ -543,7 +542,9 @@
-
- sprintf(outfile,"/tmp/lpq.%08x",str_checksum(syscmd));
-
- - if (cachetime && stat(outfile,&sbuf) == 0 &&
- + if (!lpq_cache_reset &&
- + cachetime &&
- + stat(outfile,&sbuf) == 0 &&
- (time(NULL) - sbuf.st_mtime)<cachetime) {
- DEBUG(3,("Using cached lpq output\n"));
- dorun = False;
- @@ -553,7 +554,8 @@
- int fd = open(outfile,O_RDWR);
- if (fd >= 0) {
- flock(fd,LOCK_EX);
- - if (cachetime && fstat(fd,&sbuf) == 0 &&
- + if (!lpq_cache_reset &&
- + cachetime && fstat(fd,&sbuf) == 0 &&
- (time(NULL) - sbuf.st_mtime)<cachetime) {
- DEBUG(3,("Using cached lpq output\n"));
- dorun = False;
- @@ -569,12 +571,14 @@
- DEBUG(3,("Running the command `%s' gave %d\n",syscmd,ret));
- }
-
- + lpq_cache_reset = False;
- +
- f = fopen(outfile,"r");
- if (!f)
- return(0);
-
- if (status)
- - status->message = NULL;
- + strcpy(status->message,"");
-
- while (fgets(line,sizeof(pstring),f))
- {
- diff -u -r --new-file last-version/source/server.c samba-1.9.14alpha4/source/server.c
- --- last-version/source/server.c Fri Jun 30 15:48:31 1995
- +++ samba-1.9.14alpha4/source/server.c Sat Jul 1 14:49:28 1995
- @@ -1332,7 +1332,7 @@
- /****************************************************************************
- find a service entry
- ****************************************************************************/
- -static int find_service(char *service)
- +int find_service(char *service)
- {
- int iService;
-
- @@ -3571,8 +3571,10 @@
- extern int keepalive;
-
- /* check for socket failure */
- - if (errno == EBADF)
- + if (errno == EBADF) {
- + DEBUG(2,("%s Bad file descriptor - exiting\n",timestring()));
- return;
- + }
-
- t = time(NULL);
-
- @@ -3593,11 +3595,16 @@
- clean_share_files();
-
- /* automatic timeout if all connections are closed */
- - if (num_connections_open==0 && counter >= IDLE_CLOSED_TIMEOUT)
- + if (num_connections_open==0 && counter >= IDLE_CLOSED_TIMEOUT) {
- + DEBUG(2,("%s Closing idle connection\n",timestring()));
- return;
- + }
-
- if (keepalive && (counter-last_keepalive)>keepalive) {
- - if (!send_keepalive(Client)) return;
- + if (!send_keepalive(Client)) {
- + DEBUG(2,("%s Keepalive failed - exiting\n",timestring()));
- + return;
- + }
- last_keepalive = counter;
- }
-
- @@ -3614,8 +3621,10 @@
- allidle = False;
- }
-
- - if (allidle && num_connections_open>0)
- + if (allidle && num_connections_open>0) {
- + DEBUG(2,("%s Closing idle connection 2\n",timestring()));
- return;
- + }
- }
-
- msg_type = CVAL(InBuffer,0);
- diff -u -r --new-file last-version/source/smb.h samba-1.9.14alpha4/source/smb.h
- --- last-version/source/smb.h Fri Jun 30 15:33:27 1995
- +++ samba-1.9.14alpha4/source/smb.h Sat Jul 1 14:01:04 1995
- @@ -297,7 +297,7 @@
-
- typedef struct
- {
- - char *message;
- + fstring message;
- int status;
- } print_status_struct;
-
- @@ -548,6 +548,7 @@
- };
-
- /* and a few prototypes */
- +int find_service(char *service);
- int TvalDiff(struct timeval *tvalold,struct timeval *tvalnew);
- int smb_offset(char *p,char *buf);
- void sync_file(int fnum);
- diff -u -r --new-file last-version/source/trans2.c samba-1.9.14alpha4/source/trans2.c
- --- last-version/source/trans2.c Fri Jun 30 23:04:49 1995
- +++ samba-1.9.14alpha4/source/trans2.c Sat Jul 1 11:13:37 1995
- @@ -385,21 +385,18 @@
- break;
-
- case 3:
- - if(requires_resume_key) {
- - SIVAL(p,0,reskey);
- - p += 4;
- - }
- - SIVAL(p,0,29+strlen(fname)+1);
- + SIVAL(p,0,reskey);
- put_dos_date2(p,4,cdate);
- put_dos_date2(p,8,adate);
- put_dos_date2(p,12,mdate);
- SIVAL(p,16,size);
- SIVAL(p,20,1024);
- SSVAL(p,24,mode);
- - CVAL(p,28) = strlen(fname);
- - strcpy(p + 29, fname);
- - name_ptr = p+29;
- - p += 29 + strlen(fname) + 1;
- + SIVAL(p,26,4);
- + CVAL(p,30) = strlen(fname);
- + strcpy(p+31, fname);
- + name_ptr = p+31;
- + p += 31 + strlen(fname) + 1;
- break;
-
- case 4:
- diff -u -r --new-file last-version/source/util.c samba-1.9.14alpha4/source/util.c
- --- last-version/source/util.c Sat Jul 1 01:04:24 1995
- +++ samba-1.9.14alpha4/source/util.c Sat Jul 1 14:56:52 1995
- @@ -3049,6 +3049,10 @@
- if(fstat(fd, &st)<0)
- return -1;
-
- +#ifdef S_ISFIFO
- + if (S_ISFIFO(st.st_mode)) return 0;
- +#endif
- +
- if(st.st_size == len)
- return 0;
- if(st.st_size > len)
- diff -u -r --new-file last-version/source/version.h samba-1.9.14alpha4/source/version.h
- --- last-version/source/version.h Sun Jul 2 02:10:34 1995
- +++ samba-1.9.14alpha4/source/version.h Sun Jul 2 02:17:52 1995
- @@ -1 +1 @@
- -#define VERSION "1.9.14alpha3"
- +#define VERSION "1.9.14alpha4"
-